package cn.com.tarotframework.utils.log;

import cn.com.tarotframework.utils.constants.TarotConstantUtils;
import cn.com.tarotframework.utils.response.TarotCode;
import cn.com.tarotframework.utils.response.TarotResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * copyright (C), 2022, 塔罗牌基础架构
 *
 * @author xincan
 * @version 0.0.1-SNAPSHOT
 * @program tarot-framework
 * @date 2023/1/6 16:41
 * @description 日志统一处理类
 */
@Slf4j
public class TarotLogUtils {

    /**
     * 统一日志搜集及处理
     * @param request 请求体
     * @param tarotCode 错误类型枚举对象
     * @param errorMessage 错误消息
     * @param exception 异常类型对象
     * @author xincan
     * @date 2023/1/6 14:17
     * @return cn.com.tarotframework.utils.response.TarotResult<java.lang.String>
     */
    public static TarotResult<String> messageHandler(HttpServletRequest request, TarotCode tarotCode, String errorMessage, Exception exception) {
        StackTraceElement stackTraceElement = exception.getStackTrace()[0];
        String message = StringUtils.hasText(exception.getMessage())  ? tarotCode.message() + ": " + exception.getMessage() :  tarotCode.message();
        Integer code = tarotCode.code();
        String requestType = request.getMethod();
        String requestMedia = StringUtils.hasText(request.getContentType()) ? request.getContentType() : "'default;charset=" +request.getCharacterEncoding()+ "'";
        String requestUrl = request.getRequestURL().toString();
        String className = stackTraceElement.getClassName();
        String methodName = stackTraceElement.getMethodName().contains("$") ? stackTraceElement.getMethodName().split("\\$")[1] : stackTraceElement.getMethodName();
        printLog(message, code, requestType, requestMedia, requestUrl, className, methodName, "", exception);
        if (TarotConstantUtils.TAROT_EXCEPTION_LOG_ERROR_MESSAGE.equals(errorMessage)) {
            return TarotResult.error(tarotCode);
        } else {
            return TarotResult.error(tarotCode.code(), message);
        }

    }

    /**
     * 统一日志处理方法
     * @param message 异常信息
     * @param code 错误码
     * @param requestType 请求方式
     * @param requestMedia 请求媒体类型
     * @param requestUrl 请求地址
     * @param className 报错信息类
     * @param methodName 报错信息方法
     * @param param 请求参数
     * @param exception 异常对象
     * @author xincan
     * @date 2023/1/6 14:14
     */
    public static void printLog(String message, Integer code, String requestType, String requestMedia, String requestUrl, String className, String methodName, String param, Exception exception) {
        log.error(
                "异常信息: [{}], 请求状态: [{}], 请求方式: [{}], 媒体类型: [{}], 请求URL: [{}], 对应后端业务实现类: [{}], 后端异常方法: [{}], 接收参数: [{}] ",
                message, code,
                requestType, requestMedia, requestUrl,
                className, methodName, param,
                exception
        );
    }

}
